PREGUNTA 73.

alumne@a5s112pc10:~/Desktop/S10$ ./createProcesses 
50000 processes created in 5.97057 sec.
alumne@a5s112pc10:~/Desktop/S10$ ./createThreads
50000 threads created in 1.8658 sec.

Se debe a que los threads son más rápidos, no se deben crear nuevos procesos (y lo que esto implica: hacer una copia del estado del proceso padre, su tabla de interrupciones, etc.).

---

PREGUNTA 74 Y 75.

alumne@a5s112pc10:~/Desktop/S10$ ./thread_compartMem 
Before fork (pid=5352)
I am the parent (pid=5352)
I am the child and my father is 5352. Value of a=666 (BEFORE)
I am the child and my father is 5352. Value of a=1 (AFTER)
I am the parent and a=1
alumne@a5s112pc10:~/Desktop/S10$ ./fork_compartMem 
Before fork (pid=5354)
I am the parent (pid=5354)
I am the child and my father is 5354. Value of a=666 (BEFORE)
I am the child and my father is 5354. Value of a=1 (AFTER)
I am the parent and a=666

En el fork, se crea una copia independiente de todas las variables(y su valor) que tiene el padre en el momento de hacer el fork, en cambio en el thread, no se crea ninguna copia, sigue siendo el mismo proceso con las mismas variables.

--
PREGUNTA 76.

No compila porque no se ha declarado la a en la función (y a no es una variable global, sino local).

--
PREGUNTA 77.

se está guardando en la posición 0xbfe90f34, ocupada por la variable a.

I am the parent (pid=5426)
I am the child . Value of a=666 (BEFORE)
I am the child . Value of a=1111 (AFTER)
I am the parent and a=1111

Sí, sería posible acceder a variables locales de otro pthread en el caso que las operaciones de los dos pthreads esten en el mismo ámbito.

--
PREGUNTA 78.

alumne@a5s112pc10:~/Desktop/S10$ ./thread_compartMem2 0
Before pthread_create a=666 p=0xbf830924
I am the parent (pid=5422)
I am the parent and a=666

Al hijo no le da tiempo de mostrar nada, ya que no ha sido esperado por el padre.

--
PREGUNTA 79.

alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 90113 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 86871 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 91626 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 89656 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 84807 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 88049 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 88718 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 65835 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 89260 
alumne@a5s112pc10:~/Desktop/S10$ ./threads_racecondition 
threads is 10, executing 10000 iterations and data is 89847 

Depende de las veces se da la condición:
Un thread lea la variable, en ese instante otro thread lea la variable, la incrementey vuelva guardar el valor. El primer thread, que tenía el valor de la variable antes de ser actualizada, incrementa este valor y lo guarda en memoria. Se ha perdido un incremento.

--
PREGUNTA 80.

Esta es la región crítica.

data++;

(que en realidad es: 
	read data
	data + 1
	write data
)


